package demo
// pkg/codec/codec.go
package codec

type Codec interface {
	Encode(interface{}) ([]byte, error)
	Decode([]byte) (interface{}, error)
}

// pkg/codec/proto_codec.go
package codec

import (
"github.com/golang/protobuf/proto"
)

type ProtoCodec struct{}

func (c *ProtoCodec) Encode(msg interface{}) ([]byte, error) {
	return proto.Marshal(msg.(proto.Message))
}

func (c *ProtoCodec) Decode(data []byte) (interface{}, error) {
	// 需要具体消息类型，实际使用需要结合路由信息
	panic("implement with message type context")
}

// 带协议ID的编解码扩展
type ProtoCodecWithHeader struct {
	TypeResolver func(uint32) proto.Message // 根据协议ID获取消息类型
}

func (c *ProtoCodecWithHeader) Encode(msg interface{}) ([]byte, error) {
	// 编码格式: [4字节协议ID][protobuf数据]
	m := msg.(proto.Message)
	id := GetProtocolID(m) // 需要实现协议ID映射
	data, err := proto.Marshal(m)
	if err != nil {
		return nil, err
	}
	buf := make([]byte, 4+len(data))
	binary.BigEndian.PutUint32(buf[:4], id)
	copy(buf[4:], data)
	return buf, nil
}

func (c *ProtoCodecWithHeader) Decode(data []byte) (interface{}, error) {
	if len(data) < 4 {
		return nil, errors.New("invalid data")
	}
	id := binary.BigEndian.Uint32(data[:4])
	msgType := c.TypeResolver(id)
	if msgType == nil {
		return nil, fmt.Errorf("unknown protocol id: %d", id)
	}
	err := proto.Unmarshal(data[4:], msgType)
	return msgType, err
}